意図しないオブジェクトのアップロードや変更を通知する方法、または防止する方法を教えてください
困っていた内容
特定のS3バケットやオブジェクトに対して変更等があった場合に検知する方法が知りたいです。
対応方法
1. S3イベント通知でオブジェクトイベントを通知する
S3オブジェクトの作成イベントや削除イベントが発生した場合に通知できます。
現在、Amazon S3 は次のイベントの通知を発行できます。
- 新しいオブジェクトがイベントを作成しました。
- オブジェクトの削除イベント
- オブジェクトイベントの復元
- 低冗長化ストレージ (RRS) オブジェクトがイベントを紛失した
- レプリケーションイベント
- S3 ライフサイクルの有効期限イベント
- S3 ライフサイクルの移行イベント
- S3 Intelligent−Tiering 自動アーカイブイベント
- オブジェクトのタグ付けイベント
- オブジェクト ACL PUT イベント
送信先には下記サービスを選択できます。例えば、シンプルにSNSトピックを選択しメール通知が可能です。
Amazon S3 は、次の宛先にイベントの通知メッセージを送信できます。通知設定でこれらの送信先の Amazon リソースネーム (ARN) 値を指定します。
- Amazon Simple Notification Service (Amazon SNS) のトピック
- Amazon Simple Queue Service (Amazon SQS) キュー
- AWS Lambda 関数
- Amazon EventBridge
注意点として、S3イベント通知の設定をしている状況にて、例えば、意図するS3バケット内の更新作業が発生する場合、その間はS3イベント通知を一時的に削除する、または設定したまま通知を無視するといった対応等が必要となる場合があると思います。
2. CloudTrailログでS3バケットポリシーの変更を通知する
CloudTrailの記録をCloudWatch logsに保存するように設定し、CloudWatchアラームを作成することで、S3バケットポリシーの変更を通知できます。
3. Configルールを使用し通知する
Configルールにてリソース設定を評価し、非準拠時に通知することができます。
Enable AWS Config (Gems の有効化)
このトピックに示すベストプラクティスのいくつかでは、AWS Config ルールの作成を提案しています。AWS Config では、AWS リソースの設定を評価、監査、診断するのに役立ちます。AWS Config では、リソースの設定をモニタリングし、目的とする安けけ全な設定に対して、記録された設定を評価できます。
Configルールには、様々なマネージドルールが用意されています。例えば、S3バケットでパブリック読み取り/書き込みアクセスが許可されていないことを確認するルール等があります。
s3-bucket-public-read-prohibited
Amazon S3 バケットでパブリック読み取りアクセスが許可されていないかどうかを確認します。このルールは、パブリックアクセスのブロック設定、バケットポリシー、およびバケットアクセスコントロールリスト (ACL) を確認します。
引用元: s3-bucket-public-read-prohibited - AWS Config
s3-bucket-public-write-prohibited
Amazon S3 バケットでパブリック書き込みアクセスが許可されていないかどうかを確認します。このルールは、パブリックアクセスのブロック設定、バケットポリシー、およびバケットアクセスコントロールリスト (ACL) を確認します。
引用元: s3-bucket-public-write-prohibited - AWS Config
4. その他
S3バケットやオブジェクトの変更等で通知するもの以外にも、以下のような機能があります。
S3バケットのサーバーアクセスログを有効にする
意図しない変更等が発生した場合に、アクセスログでリクエスト情報を確認することができます。
オブジェクトロック
改ざんそのものを防止する機能としてオブジェクトロック機能を利用できます。
オブジェクトロックは、個々のオブジェクトバージョンに対して適用されるので、新しいバージョンの作成を防ぐものではないことにご留意ください。
オブジェクトロックは、バージョニングされたバケットでのみ機能し、保持期間とリーガルホールドは個々のオブジェクトバージョンに適用されます。オブジェクトバージョンをロックすると、Amazon S3 はそのオブジェクトバージョンのメタデータにロック情報を保存します。オブジェクトに保持期間またはリーガルホールドを設定しても、リクエストで指定されたバージョンのみが保護されます。したがって、オブジェクトの新しいバージョンが作成されることを妨げることはありません。
まとめ
要件によって、上述した機能が当てはまらないことや、他にも有効な機能もあるかと思いますが、上記ご参考いただけると嬉しいです。